def fn(i,j):
    print(f'{j}*{i}={i*j}',end='\t')
    if i == j:
        print()

#
# list1 = [fn(i,j) for i in range(1,10) for j in range(1,10)]

list7 = [[f'{j}*{i}={i*j}' for i in range(1,j+1)] for j in range(1,10)]
for i in list7:
    print(i)

s = [fn(i,x) for i in range(1, 10) for x in range(1, i + 1)]


# print('\t1. 类的属性：是属于整个类的，被该类的所有对象所共享。'
#       '类属性通常在类定义内部但在任何方法之外进行定义。通过类名直接访问。'
#        '\n\t对象的属性：是属于特定对象特有的，每个对象可以有不同的值，互不干扰。'
# '通常在对象创建后通过特定的方法或者在初始化方法 __init__ 中进行定义。'
#       '\n访问对象属性需要先创建对象，然后通过对象来访问。类属性反映的是类的整体特性，’
#       ‘而对象属性反映的是每个对象独有的特性。\n')

# 私有属性的特点：
# 双下划线开头的属性，
# 一般在类内部时用self.属性的方式访问；在外部时受保护的，用对象名+点+单下划线+类名+双下划线+属性的方式访问
#
# print(' \t2.当创建 A 类的对象时，会调用父类 B 的构造方法。在子类 A 的构造方法中，可以通过使用 super() 函数来调用父类的构造方法\n')
#
# A类没有创建构造方法，创造A类对象时，会调用B类的构造方法
# A类实现了创建构造方法，创造A类对象时，不会调用B类的构造方法
#



# print('\t3.公有方法：直接在类中定义,'
# '私有方法：以双下划线开头,'
# '受保护的方法：以单下划线开头')